查看原文
其他

【他山之石】反卷积和上采样

“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。

作者:知乎—lsy要发顶会

地址:https://www.zhihu.com/people/lun-wen-guai-85

最近对于分割中decoder部分扩大图像尺寸的操作困惑,特记录一下


01

反卷积
pytorch
nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True, dilation=1)#in_channels(int) – 输入信号的通道数#out_channels(int) – 卷积产生的通道数#kerner_size(int or tuple) - 卷积核的大小#stride(int or tuple,optional) - 卷积步长,即要将输入扩大的倍数。#padding(int or tuple, optional) - 输入的每一条边补充0的层数,高宽都增加2*padding#output_padding(int or tuple, optional) - 输出边补充0的层数,高宽都增加padding#groups(int, optional) – 从输入通道到输出通道的阻塞连接数#bias(bool, optional) - 如果bias=True,添加偏置#dilation(int or tuple, optional) – 卷积核元素之间的间距
  • 反卷积的具体操作
原图输入尺寸为【1,3,3,3】对应【batch_size,channels,width,height】
反卷积tconv = nn.ConvTranspose2d(3,3,3,stride=2,padding=1)
求反卷积的输出尺寸?
第一步:对输入的特征图做插值,在原先高宽方向的每两个相邻中间插上(Stride−1)列0,如下图所示,原来的尺寸为3*3,因为stride=2,则是在相邻行(列)之间插入(2-1)行(列)0
插入后的尺寸为为:height = height+(height-1)*(stride-1),这里也就是h=3+(2-1)(3-1)=5,即插值过后的 特征图为5*5

第二步:求新的卷积核设置
新卷积核的kernel_new不变为3,stride_new恒为1,padding_new =(kernel_size - padding - 1) = 1
第三步:用新的卷积核在新的特征图上做常规的卷积,得到的结果就是逆卷积的结果。
即在5*5的特征图上执行nn.conv(1,3,3,stride = 1,padding = 1),最后输出的特征图尺寸为:(5-3+2*1)/1+1=5

  • 反卷积核的确定
卷积核的确定方式主要有两种,一是通过双线性插值固定卷积核的参数,不随着学习过程更新;二是随机初始化,并随着学习过程更新。
个人觉得随机初始化可能效果更好一点
下边贴一个双线性插值固定卷积核参数代码
# 定义 bilinear kerneldef bilinear_kernel(in_channels, out_channels, kernel_size): #return a bilinear filter tensor factor = (kernel_size + 1) // 2 if kernel_size % 2 == 1: center = factor - 1 else: center = factor - 0.5 og = np.ogrid[:kernel_size, :kernel_size] filt = (1 - abs(og[0] - center) / factor) * (1 - abs(og[1] - center) / factor) weight = np.zeros((in_channels, out_channels, kernel_size, kernel_size), dtype='float32') weight[range(in_channels), range(out_channels), :, :] = filt return torch.from_numpy(weight)


02

上采样
pytorch
可以给出scale_factor或目标输出大小(size)来计算输出大小。
torch.nn.Upsample(size=None, scale_factor=None, mode='nearest', align_corners=None)

size :目标输出大小

scale_factor:比例因子
mode:有nearest, linear, bilinear, bicubic and trilinear. 默认是: nearest
支持1d,2d,3d,可用于上采样的算法分别是最近邻和线性,双线性,双三次和三线性。

可以仅给size参数或者scale_factor来获得对应大小的输出

03

对比
反卷积有参数可以训练(不固定参数),上采样没有参数,速度更快,采取给定策略上采样。

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。


“他山之石”历史文章


更多他山之石专栏文章,

请点击文章底部“阅读原文”查看



分享、点赞、在看,给个三连击呗!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存